package com.javaweb.task;

import java.time.Duration;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.javaweb.annotation.task.DistributedTimedTask;
import com.javaweb.base.BaseService;
import com.javaweb.constant.SystemConstant;
import com.javaweb.util.core.StringUtil;

/**
 * 系统定时任务
 * 
 * @author tank2140896
 */
@Async
@Component
public class SystemTask extends BaseService {
	
    /**
     * 每隔1小时执行一次（整点）
     * <p>
     * 在线cron表达式生成器：https://cron.qqe2.com
     */
	@DistributedTimedTask(taskUniqueName="systemTask_1")
	@Scheduled(cron="0 0 */1 * * ?")
	public void systemTask_1(){
    	interfacesService.synchronizedRedisInterfaceHistoryTimes();
    	log.info("每隔1小时[同步redis中的各个接口调用次数]执行完毕");
	}
    
    /**
     * 每隔60秒执行一次
     */
	/**
	//@DistributedTimedTask(taskUniqueName="systemTask_2")//所有系统都可以有该任务
    @Scheduled(fixedDelay=60*1000)//@Scheduled(fixedRate=60*1000)
    public void systemTask_2() {
    	Runtime runtime = Runtime.getRuntime();
    	long maxMemory = runtime.maxMemory();
    	long totalMemory = runtime.totalMemory();
    	long freeMemory = runtime.freeMemory();
    	String out = "每隔60秒[可以获得的最大总内存是：%s，目前已经分配到的内存是：%s，目前使用分配到的内存是：%s，目前剩余分配到的内存是：%s，还可以获得的最大剩余内存是：%s]执行完毕";
    	out = String.format(out,
    			NumberFormatUtil.getdefaultFormatCapacity(new BigDecimal(maxMemory)),
    			NumberFormatUtil.getdefaultFormatCapacity(new BigDecimal(totalMemory)),
    			NumberFormatUtil.getdefaultFormatCapacity(new BigDecimal(totalMemory-freeMemory)),
    			NumberFormatUtil.getdefaultFormatCapacity(new BigDecimal(freeMemory)),
    			NumberFormatUtil.getdefaultFormatCapacity(new BigDecimal(maxMemory-(totalMemory-freeMemory)))
    	);
    	log.info(out);
    }
    */
    
    /**
     * 每隔10秒执行一次（所有微服务内的系统都要接入）
     */
    @Scheduled(fixedDelay=10*1000)
    public void systemTask_3() {
    	String appName = environment.getProperty("spring.application.name");
    	if(!StringUtil.isEmpty(appName)) {
    		valueOperations.set(SystemConstant.APP_KEY_PREFIX+appName,appName,Duration.ofSeconds(20));
    	}
    	//log.info("每隔10秒[维持系统应用（"+appName+"）心跳]执行完毕");
    }

}
